package com.librelato.persistencia;

import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Time;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;

import com.librelato.bean.AcaoAtaEletronicaBean;
import com.librelato.bean.AtaEletronicaBean;
import com.librelato.bean.DiretoriaBean;
import com.librelato.bean.EmpresaBean;
import com.librelato.bean.UsuarioBean;
import com.librelato.persistencia.config.SQLConfiguracao;
import com.librelato.persistencia.enums.EnumCondicao;
import com.librelato.persistencia.interfaces.IAtaEletronicaDao;
import com.librelato.util.Ferramentas;

public class AtaEletronicaDao<P extends AtaEletronicaBean> extends
		DaoGenerico<P> implements IAtaEletronicaDao<P> {

	@Override
	public String procuraPorParam(String tabela, String campo, String valor,
			EnumCondicao condicao) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public P salvar(P p) throws Exception {
		long maxCodAta = 0;
		long maxCodAcao = 0;
		int psIndex = 1;
		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_max_ata_eletronica");
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			if (rs.next()) {
				maxCodAta = rs.getLong("MAXCOD");
				query = SQLConfiguracao.getInstance().getValor(
						"insere_ata_eletronica");
				ps = conn.prepareStatement(query);
				ps.setLong(psIndex++, maxCodAta);
				ps.setString(psIndex++, p.getOrigemAta());
				ps.setString(psIndex++, p.getFilialAta().getFilial());
				ps.setString(psIndex++, p.getDiretoriaAta()
						.getCodigoDiretoria());
				ps.setDate(psIndex++, new Date(p.getDataAta().getTime()));
				ps.setDate(psIndex++, new Date(new java.util.Date().getTime()));
				ps.setTime(psIndex++, new Time(p.getHoraInicioAta().getTime()));
				ps.setTime(psIndex++, new Time(p.getHoraFimAta().getTime()));
				ps.setString(psIndex++, p.getLocalAta());
				ps.setString(psIndex++, p.getAssuntoAta());
				ps.setLong(psIndex++, 1);
				ps.setString(psIndex++, p.getAssuntosTratadosAta());
				ps.setLong(psIndex++,
						Long.parseLong(p.getUsuarioDono().getCodigo()));
				ps.setInt(psIndex++, Integer.parseInt(p.getNivelAcessoAta()));
				ps.execute();
				for (UsuarioBean resp : p.getListaResponsaveis()) {
					query = SQLConfiguracao.getInstance().getValor(
							"insere_responsavel_ata");
					ps = conn.prepareStatement(query);
					ps.setLong(1, Long.parseLong(resp.getCodigo()));
					ps.setLong(2, maxCodAta);
					ps.execute();
					conn.commit();
				}

				for (AcaoAtaEletronicaBean acao : p.getAcoesAta()) {
					for (UsuarioBean resp : acao.getListaResponsaveis()) {
						query = SQLConfiguracao.getInstance().getValor(
								"localiza_max_acao_ata_eletronica");
						ps = conn.prepareStatement(query);
						rs = ps.executeQuery();
						if (rs.next()) {
							psIndex = 1;
							maxCodAcao = rs.getLong("MAXCOD");
							query = SQLConfiguracao.getInstance().getValor(
									"insere_acao_ata");
							ps = conn.prepareStatement(query);
							ps.setLong(psIndex++, maxCodAcao);
							ps.setLong(psIndex++, maxCodAta);
							// ps.setLong(psIndex++, Long.parseLong(acao
							// .getResponsavel().getCodigo()));
							ps.setLong(psIndex++,
									Long.parseLong(resp.getCodigo()));
							ps.setDate(psIndex++, new Date(acao.getData()
									.getTime()));
							ps.setString(psIndex++, acao.getStatus());
							ps.setString(psIndex++, acao.getAcoes());
							ps.execute();
							conn.commit();
						}
					}
				}
				p.setIdAta(maxCodAta);

			}

		} catch (Exception e) {
			throw e;
		}

		return p;
	}

	public byte[] imprimeAta(AtaEletronicaBean ata, String codigoUser)
			throws Exception {
		String jasper = Ferramentas.getDiretorioReal("/rel/AtaReuniao.jasper");
		String pedPdf = Ferramentas.getDiretorioReal("/rel/") + "\\ata"
				+ codigoUser + ".pdf";
		byte[] bytes = null;
		try {
			conn = GerenciadorConexao.getConexao();
			Map<String, Object> params = new HashMap<String, Object>();
			params.put("IDATA", ata.getIdAta());
			JasperPrint print = JasperFillManager.fillReport(jasper, params,
					conn);

			JasperExportManager.exportReportToPdfFile(print, pedPdf);
			bytes = JasperExportManager.exportReportToPdf(print);

		} catch (Exception e) {
			throw e;
		} finally {
		}
		return bytes;
	}

	@Override
	public void excluir(P p) throws Exception {
		// TODO Auto-generated method stub

	}

	@Override
	public void editar(P p) throws Exception {
		int psIndex = 1;
		try {
			query = SQLConfiguracao.getInstance().getValor(
					"altera_ata_eletronica");
			conn = GerenciadorConexao.getConexao();
			ps = conn.prepareStatement(query);
			ps.setBytes(psIndex++, p.getListaDePresencaReuniao());
			ps.setString(psIndex++, p.getExtensaoListaPresenca().trim());
			ps.setLong(psIndex++, p.getIdAta());
			ps.execute();
			conn.commit();

		} catch (Exception e) {
			conn.rollback();
			throw e;
		}

	}

	@Override
	public void preSalvar(P p) {
		// TODO Auto-generated method stub

	}

	@Override
	public List<DiretoriaBean> buscaDiretorias(Map<String, String> param)
			throws Exception {

		DiretoriaBean diretoria = null;
		List<DiretoriaBean> diretorias = new ArrayList<DiretoriaBean>();

		try {
			conn = GerenciadorConexao.getConexao();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_diretorias");
			ps = conn.prepareStatement(query);
			rs = ps.executeQuery();
			while (rs.next()) {
				diretoria = new DiretoriaBean();
				diretoria.setCodigoDiretoria(rs.getString("AK6_CODIGO"));
				diretoria.setDescricaoDiretoria(rs.getString("AK6_DESCRI"));
				diretorias.add(diretoria);
			}

		} catch (Exception e) {
			throw e;
		}

		return diretorias;
	}

	@Override
	public List<AtaEletronicaBean> buscaAtaEletronica(Map<String, String> param)
			throws Exception {
		List<AtaEletronicaBean> listaAta = new ArrayList<AtaEletronicaBean>();
		List<AcaoAtaEletronicaBean> listaAcao = new ArrayList<AcaoAtaEletronicaBean>();
		AtaEletronicaBean ata = null;
		AcaoAtaEletronicaBean acao = null;
		ResultSet rs2 = null;
		int psIndex = 1;
		try {
			conn = GerenciadorConexao.getConexao();
			StringBuilder sb = new StringBuilder();
			query = SQLConfiguracao.getInstance().getValor(
					"localiza_ata_eletronica");
			sb.append(query);
			if (param.get("FILIALATA") != null
					&& !"".equals(param.get("FILIALATA"))) {
				sb.append(" AND FILIAL_ATA = ?");
			}
			if (param.get("DIRETORIAATA") != null
					&& !"".equals(param.get("DIRETORIAATA"))) {
				sb.append(" AND DIRETORIA_ATA = ?");
			}
			if (param.get("DATAATADE") != null
					&& !"".equals(param.get("DATAATADE"))) {
				sb.append(" AND DATA_ATA >= ?");
			}
			if (param.get("DATAATAATE") != null
					&& !"".equals(param.get("DATAATAATE"))) {
				sb.append(" AND DATA_ATA <= ?");
			}
			if (param.get("NUMEROATA") != null
					&& !"".equals(param.get("NUMEROATA"))) {
				sb.append(" AND ID_ATA = ?");
			}
			if (param.get("ASSUNTOATA") != null
					&& !"".equals(param.get("ASSUNTOATA"))) {
				sb.append(" AND UPPER(ASSUNTO_ATA) LIKE ?");
			}

			sb.append(" ORDER BY ID_ATA");
			ps = conn.prepareStatement(sb.toString());

			ps.setInt(psIndex++, Integer.parseInt(param.get("NIVELACESSOATA")));
			ps.setString(psIndex++, param.get("USUARIOATA"));
			if (param.get("FILIALATA") != null
					&& !"".equals(param.get("FILIALATA"))) {
				ps.setString(psIndex++, param.get("FILIALATA"));
			}
			if (param.get("DIRETORIAATA") != null
					&& !"".equals(param.get("DIRETORIAATA"))) {
				ps.setString(psIndex++, param.get("DIRETORIAATA"));
			}
			if (param.get("DATAATADE") != null
					&& !"".equals(param.get("DATAATADE"))) {
				ps.setString(psIndex++, param.get("DATAATADE"));
			}
			if (param.get("DATAATAATE") != null
					&& !"".equals(param.get("DATAATAATE"))) {
				ps.setString(psIndex++, param.get("DATAATAATE"));
			}
			if (param.get("NUMEROATA") != null
					&& !"".equals(param.get("NUMEROATA"))) {
				ps.setString(psIndex++, param.get("NUMEROATA"));
			}
			if (param.get("ASSUNTOATA") != null
					&& !"".equals(param.get("ASSUNTOATA"))) {
				ps.setString(psIndex++, param.get("ASSUNTOATA").toUpperCase()
						+ "%");
			}

			rs = ps.executeQuery();
			while (rs.next()) {
				ata = new AtaEletronicaBean();
				ata.setIdAta(rs.getLong("ID_ATA"));
				ata.setAssuntoAta(rs.getString("ASSUNTO_ATA"));
				ata.setAssuntosTratadosAta(rs.getString("ASSUNTOBS_ATA"));
				ata.setDataAta(rs.getDate("DATA_ATA"));
				ata.setDataEmissaoAta(rs.getTimestamp("DATAEMISSAO_ATA"));
				ata.setFilialAta(new EmpresaBean(rs.getString("FILIAL_ATA"), rs
						.getString("DESCRICAO_FILIAL")));
				ata.setDiretoriaAta(new DiretoriaBean(rs
						.getString("AK6_CODIGO"), rs.getString("AK6_DESCRI")));
				ata.setHoraInicioAta(new java.util.Date(rs.getTime(
						"HORAINICIO_ATA").getTime()));
				ata.setHoraFimAta(new java.util.Date(rs.getTime("HORAFIM_ATA")
						.getTime()));
				ata.setLocalAta(rs.getString("LOCAL_ATA"));
				ata.setOrigemAta(rs.getString("ORIGEM_ATA"));
				// ata.setResponsavel(new UsuarioBean(rs
				// .getString("IDRESPONSAVEL_ATA"), rs.getString("NOME"),
				// null));
				ata.setListaDePresencaReuniao(rs.getBytes("LISTAPRESENCA_ATA"));
				ata.setExtensaoListaPresenca(rs
						.getString("EXTENSAOLISTAPRESENCA_ATA"));

				query = SQLConfiguracao.getInstance().getValor(
						"localiza_responsaveis_ata");
				ps = conn.prepareStatement(query);
				ps.setLong(1, ata.getIdAta());
				rs2 = ps.executeQuery();
				ata.setListaResponsaveis(new ArrayList<UsuarioBean>());
				ata.setNomeResponsaveis("");
				while (rs2.next()) {
					UsuarioBean resp = new UsuarioBean(rs2.getString("IDUSER"),
							rs2.getString("NOME"), null);
					ata.getListaResponsaveis().add(resp);
					ata.setNomeResponsaveis(ata.getNomeResponsaveis()
							+ rs2.getString("NOME") + " / ");
				}
				query = SQLConfiguracao.getInstance().getValor(
						"localiza_acao_ata_eletronica");
				ps = conn.prepareStatement(query);
				ps.setLong(1, ata.getIdAta());
				rs2 = ps.executeQuery();
				while (rs2.next()) {
					acao = new AcaoAtaEletronicaBean();
					acao.setData(rs2.getDate("DATA_ACAO"));
					acao.setResponsavel(new UsuarioBean(rs2
							.getString("IDRESPONSAVEL_ACAO"), rs2
							.getString("NOME"), null));
					acao.setStatus(rs2.getString("STATUS_ACAO"));
					acao.setAcoes(rs2.getString("DESCRICAO_ACAO"));
					listaAcao.add(acao);
				}
				ata.setAcoesAta(listaAcao);
				listaAta.add(ata);
			}

		} catch (Exception e) {
			throw e;
		}

		return listaAta;
	}

}
